/**
 * @file mainTask.h
 * @brief 系统主任务头文件
 */

#ifndef MAIN_TASK_H
#define MAIN_TASK_H

#include <stdint.h>
#include <stdbool.h>
#include "cmsis_os2.h"

// 系统状态定义
typedef enum {
    SYSTEM_STATE_INIT,              // 状态0: 硬件及系统初始化
    SYSTEM_STATE_WAIT_USER_DATA,    // 状态1: 初始状态(等待用户数据)
    SYSTEM_STATE_WAIT_START_KEY,    // 状态2: 等待按下开始按键
    SYSTEM_STATE_WATER_DISPENSING,  // 状态3: 开始取水
    SYSTEM_STATE_CLOSE_VALVE,       // 状态4: 关阀
    SYSTEM_STATE_END_DISPENSE       // 状态5: 结束取水，取水消息回显
} SystemState;

// 泄水阀状态定义
typedef enum {
    DRAIN_VALVE_CLOSED,             // 关闭
    DRAIN_VALVE_OPEN,               // 打开
    DRAIN_VALVE_CLOSING             // 正在关闭
} DrainValveState;

// 设备状态结构体
typedef struct {
    // 系统状态
    SystemState systemState;
    
    // 用户数据
    uint32_t userId;
    float userBalance;
    
    // 设备状态
    bool waterValveState;           // 取水阀开关状态
    bool uvLampState;               // 紫外灯开关状态
    DrainValveState drainValveState; // 泄水阀状态
    
    // 计时器
    uint32_t timeoutCounter;        // 超时计数器
    uint32_t dispenseTimeCounter;   // 取水计时器
    uint32_t displayTimeCounter;    // 显示计时器
    uint32_t drainValveOpenTimer;   // 泄水阀打开计时器
    uint32_t drainValveClosingTimer; // 泄水阀关闭计时器
    uint32_t uvWorkTimeCounter;     // 紫外灯累计工作时长
    
    // 数据
    uint32_t pulseCounter;          // 脉冲计数
    float totalWaterVolume;         // 累计用水量
    float currentBalance;           // 当前余额
    float uvIntensity;              // 紫外强度
    float uvLampTemperature;        // 紫外灯温度
} DeviceStatus;

// 宏定义
#define TIMEOUT_LIMIT 30000         // 超时限制(毫秒)
#define DISPLAY_TIME_LIMIT 5000     // 显示时间限制(毫秒)
#define DRAIN_VALVE_OPEN_TIME_LIMIT 10000  // 泄水阀打开时间限制(毫秒)
#define DRAIN_VALVE_CLOSING_TIME_LIMIT 5000 // 泄水阀关闭时间限制(毫秒)
#define UV_HIGH_TEMP_THRESHOLD 60.0 // 紫外灯高温限制值(摄氏度)
#define UV_LOW_TEMP_THRESHOLD 20.0  // 紫外灯低温限制值(摄氏度)
#define ENV_TEMP_THRESHOLD 5.0      // 环境温度阈值(摄氏度)

// 任务相关定义
#define MAIN_TASK_PRIORITY osPriorityNormal
#define MAIN_TASK_STACK_SIZE 1024

// 全局设备状态变量声明
extern DeviceStatus deviceStatus;
extern osThreadId_t mainTaskId;

// 函数声明
void mainTask(void *argument);
osThreadId_t createMainTask(void);
void initializeSystem(void);

#endif /* MAIN_TASK_H */